﻿
namespace Bettzueche.Dampfross
{
    /// <summary>
    /// Richtungen für vertikale (oben flache) Sechsecke.
    /// Reihenfolge: von NO im Gegenuhrzeigersinn bis SO.
    /// </summary>
    public enum HexRichtungen
    {
        /// <summary>zum nordöstlichen Nachbarn (Richtung 0).</summary>
        NO=0,
        /// <summary>zum nördlichen Nachbarn (Richtung 1).</summary>
        N=1,
        /// <summary>zum nordwestlichen Nachbarn (Richtung 2).</summary>
        NW=2,
        /// <summary>zum südwestlichen Nachbarn (Richtung 3).</summary>
        SW=3,
        /// <summary>zum südlichen Nachbarn (Richtung 4).</summary>
        S=4,
        /// <summary>zum südöstlichen Nachbarn (Richtung 5).</summary>
        SO=5 
    }

    /// <summary>
    /// HexRichtung-Enum als Klasse "getarnt" mit implizitem cast nach int und
    /// explizitem cast von int nach Richtug.
    /// </summary>
    public class Richtung
    {
        public static readonly Richtung NO = new Richtung(HexRichtungen.NO);
        public static readonly Richtung N = new Richtung(HexRichtungen.N);
        public static readonly Richtung NW = new Richtung(HexRichtungen.NW);
        public static readonly Richtung SW = new Richtung(HexRichtungen.SW);
        public static readonly Richtung S = new Richtung(HexRichtungen.S);
        public static readonly Richtung SO = new Richtung(HexRichtungen.SO);
        public HexRichtungen Dir { get; private set; }

        private Richtung(HexRichtungen r) {
            Dir = r;
        }

        /// <summary>
        /// Performs an implicit conversion from <see cref="Richtung"/> to <see cref="System.Int32"/>.
        /// </summary>
        /// <param name="r">The Richtung.</param>
        /// <returns>
        /// The result of the conversion.
        /// </returns>
        public static implicit operator int(Richtung r) {
            return (int)r.Dir;
        }

        /// <summary>
        /// Performs an explicit conversion from <see cref="System.Int32"/> to <see cref="Richtung"/>.
        /// </summary>
        /// <param name="i">Ordinalzahl zu <see cref="HexRichtungen"/></param>
        /// <returns>
        /// The result of the conversion.
        /// </returns>
        public static explicit operator Richtung(int i) {
            var dir = (HexRichtungen)i;
            return new Richtung(dir);
        }

    }
}
